-- leader key 为空格
-- vim.g.mapleader = " "
-- vim.g.maplocalleader = " "

-- 本地变量
local map = vim.api.nvim_set_keymap
local opt = {
  noremap = true,
  silent = true
}


-- 设置全局快捷键
--

-- " 跳到文件搜索 经常用
vim.api.nvim_set_keymap('n', '[[', ':Telescope find_files<CR>',{ noremap = true, silent = true } )
-- " 跳到帮助搜索 经常用
vim.api.nvim_set_keymap('n', 'gh', ':Telescope help_tags<CR>',{ noremap = true, silent = true } )

vim.api.nvim_set_keymap('n', '<c-f>', ':Telescope live_grep<CR>', { noremap = true, silent = true })
-- 切换文件树目录 
vim.api.nvim_set_keymap('n', '<M-1>', ':NvimTreeToggle<CR>', { noremap = true, silent = true })
-- " 窗口循环切换
vim.api.nvim_set_keymap('n', 'm', '<c-w>w', { noremap = true, silent = true })
-- "这个粘贴  不知道咋说 ，就是在块后面 进行 粘贴
vim.api.nvim_set_keymap('n', 'gp', 'gP', { noremap = true, silent = true })



-- "在当前行的下一行粘贴
vim.api.nvim_set_keymap('n', 'gop', ':pu<CR>', { noremap = true, silent = true })
-- "在当前行的上一行粘贴
vim.api.nvim_set_keymap('n', 'gip', 'k:pu<CR>', { noremap = true, silent = true })


-- " 上一个tab 这个把 宏的按钮 给替换 了，所以下面就把 Q 用来代替宏
vim.api.nvim_set_keymap('n', 'q', ':bp<CR>', { noremap = true, silent = true })
--  由于把q 替换了 用 Q 来代替宏录制
vim.api.nvim_set_keymap('n', 'Q', 'q', { noremap = true, silent = true })
-- " 下一个tab
vim.api.nvim_set_keymap('n', 'w', ':bn<CR>', { noremap = true, silent = true })



-- 可视模式下复制
vim.api.nvim_set_keymap('v', '<c-c>', '"+y', { noremap = true, silent = true })
-- 可视模式下粘贴
vim.api.nvim_set_keymap('v', '<c-v>', '"+P', { noremap = true, silent = true })
-- 插入模式下粘贴
vim.api.nvim_set_keymap('i', '<c-v>', '<c-r>+', { noremap = true, silent = true })






-- "visual 模式 下 按* 号 搜索 光标选中的内容(对已选中的内容进行查找)
vim.api.nvim_set_keymap('v', '*', '"ry/<C-R>r<CR>N', { noremap = true, silent = true })
vim.api.nvim_set_keymap('v', '#', '"ry/<C-R>r<CR>n', { noremap = true, silent = true })







-- "重新加载ideavimrc
vim.api.nvim_set_keymap('n', '<leader>rr', ':source ~/.config/nvim/init.lua<CR>', { noremap = true, silent = true })



-- " 全部选中
vim.api.nvim_set_keymap('n', '<leader>sa', 'ggVG', { noremap = true, silent = true })

-- " 快速保存
vim.api.nvim_set_keymap('n', '<c-s>', ':w<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'sn', ':noh<CR>', { noremap = true, silent = true })

-- 以后不要用s 了 用 cl 来修改单个单词吧
vim.api.nvim_set_keymap('n', 's', '', { noremap = true, silent = true })
-- 关闭 当前buffer
vim.api.nvim_set_keymap('n', 'x', ':bd<CR>', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'go', '', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'gi', '', { noremap = true, silent = true })
-- nmap s <c-[>
-- nmap x <c-[>

-- 需要安装 ideavim easymotion acejump 插件 "
vim.api.nvim_set_keymap('n', '<space>', ':HopChar1<CR>', { noremap = true, silent = true })


-- "内部的iw{{{
vim.api.nvim_set_keymap('n', 'vn', 'v^', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vq', 'v$', { noremap = true, silent = true })
-- " vnoremap q g_


vim.api.nvim_set_keymap('o', 'q', '$', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'n', '^', { noremap = true, silent = true })
-- "内部
vim.api.nvim_set_keymap('o', 'w', 'iw', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', ',', 'i(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', '(', 'i(', { noremap = true, silent = true })
-- "onoremap ie i(
vim.api.nvim_set_keymap('o', 'r', 'i[', { noremap = true, silent = true })
-- "onoremap ir i[
vim.api.nvim_set_keymap('o', 'm', 'i{', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', '.', 'i<', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'z', 'i\'', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'c', 'i"', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'u', 'it', { noremap = true, silent = true })
-- 外部
vim.api.nvim_set_keymap('o', 'aw', 'aw', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'a,', 'a(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'ae', 'a(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'ar', 'a[', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'am', 'a{', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'a.', 'a<', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'az', 'a\'', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', 'ac', 'a"', { noremap = true, silent = true })
vim.api.nvim_set_keymap('o', '<CR>', 'at', { noremap = true, silent = true })

-- "内部
vim.api.nvim_set_keymap('n', 'vw', 'viw', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'v(', 'vi(', { noremap = true, silent = true })
-- "nnoremap vie vi(
vim.api.nvim_set_keymap('n', 'vr', 'vi[', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vm', 'vi{', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'v.', 'vi<', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'v,', 'vi(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vz', 'vi\'', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vc', 'vi"', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vu', 'vit', { noremap = true, silent = true })
-- "外部
vim.api.nvim_set_keymap('n', 'vaw', 'vaw', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'va,', 'va(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vae', 'va(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'var', 'va[', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vam', 'va{', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'va.', 'va<', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'va,', 'va(', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vaz', 'va\'', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'vac', 'va"', { noremap = true, silent = true })
vim.api.nvim_set_keymap('n', 'v<CR>', 'vat', { noremap = true, silent = true })

local pluginKeys = {}

-- 代码注释插件
-- see ./lua/plugin-config/comment.lua
pluginKeys.comment = {
  toggler = {
    line = 'gcc',
    block = 'gbc',
  },
  opleader = {
    line = 'gc',
    bock = 'gb'
  }
}

-- ctrl + /
map("n", "<C-_>", "gcc", {noremap = false})
map("v", "<C-_>", "gcc", {noremap = false})

-- lsp 回调函数快捷键设置
pluginKeys.maplsp = function(mapbuf)
  -- rename
  mapbuf('n', '<leader>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opt)
  -- code action
  mapbuf('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opt)

  -- go xx
  mapbuf('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>', opt)
  mapbuf('n', 'gh', '<cmd>lua vim.lsp.buf.hover()<CR>', opt)
  mapbuf('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<CR>', opt)
  mapbuf('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opt)
  mapbuf('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opt)
  -- diagnostic
  mapbuf('n', 'go', '<cmd>lua vim.diagnostic.open_float()<CR>', opt)
  mapbuf('n', 'gp', '<cmd>lua vim.diagnostic.goto_prev()<CR>', opt)
  mapbuf('n', 'gn', '<cmd>lua vim.diagnostic.goto_next()<CR>', opt)
  -- mapbuf('n', '<leader>q', '<cmd>lua vim.diagnostic.setloclist()<CR>', opt)
  mapbuf('n', '<gk>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opt)
  -- leader + =
  mapbuf('n', '<leader>=', '<cmd>lua vim.lsp.buf.formatting()<CR>', opt)
  -- mapbuf('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opt)
  -- mapbuf('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opt)
  -- mapbuf('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opt)
  -- mapbuf('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opt)
end

-- nvim-cmp 自动补全
pluginKeys.cmp = function(cmp)
  return {
    -- 出现补全
    ['<A-.>'] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }),
    -- 取消
    ['<A-,>'] = cmp.mapping({
      i = cmp.mapping.abort(),
      c = cmp.mapping.close(),
    }),
    -- 确认
    -- Accept currently selected item. If none selected, `select` first item.
    -- Set `select` to `false` to only confirm explicitly selected items.
    ['<CR>'] = cmp.mapping.confirm({
      select = true ,
      behavior = cmp.ConfirmBehavior.Replace
    }),
    -- ['<C-y>'] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `<C-y>` mapping.
    ['<C-u>'] = cmp.mapping(cmp.mapping.scroll_docs(-4), { 'i', 'c' }),
    ['<C-d>'] = cmp.mapping(cmp.mapping.scroll_docs(4), { 'i', 'c' }),
  }
end


return pluginKeys
